/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.unisinos.tga;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.nio.IntBuffer;
import javax.media.opengl.GL;

/**
 *
 * @author Douglas
 */
public class Menu {

    Imagem novo = null;
    Imagem addFile = null;
    Imagem openFile = null;
    Imagem deleta = null;
    Imagem save = null;
    Imagem close = null;
    Imagem guy = null;
    public static final int NOVO = 1;
    public static final int ADDFILE = 2;
    public static final int SALVAR = 3;
    public static final int ABRIR = 4;
    public static final int DELETAR = 5;
    public static final int ADD_GUY = 6;
    private int windowH = 768 - 100;

    /**
     * Carrega todas as imagens que irão compor o menu
     */
    public void carregaMenu() {
        // Se colocar o mushroom.ppm, vai carregar no P3 (ASC II)
        File file = new File("novo-48.ppm");
        InputStream is = null;
        try {
            is = new FileInputStream(file);
        } catch (FileNotFoundException ex) {
            System.out.println("Erro");
        }
        PPM ppm = new PPM();
        try {
            ppm.loadPPM(is);
        } catch (IOException ex) {
            System.out.println("Erro");
        }
        novo = ppm.getImagem();
        novo.setPixels((IntBuffer) novo.getPixels().rewind());

        file = new File("add_file-48.ppm");
        is = null;
        try {
            is = new FileInputStream(file);
        } catch (FileNotFoundException ex) {
            System.out.println("Erro");
        }
        ppm = new PPM();
        try {
            ppm.loadPPM(is);
        } catch (IOException ex) {
            System.out.println("Erro");
        }
        addFile = ppm.getImagem();
        addFile.setPixels((IntBuffer) addFile.getPixels().rewind());

        file = new File("folder-48.ppm");
        is = null;
        try {
            is = new FileInputStream(file);
        } catch (FileNotFoundException ex) {
            System.out.println("Erro");
        }
        ppm = new PPM();
        try {
            ppm.loadPPM(is);
        } catch (IOException ex) {
            System.out.println("Erro");
        }
        openFile = ppm.getImagem();
        openFile.setPixels((IntBuffer) openFile.getPixels().rewind());

        file = new File("delete-48.ppm");
        is = null;
        try {
            is = new FileInputStream(file);
        } catch (FileNotFoundException ex) {
            System.out.println("Erro");
        }
        ppm = new PPM();
        try {
            ppm.loadPPM(is);
        } catch (IOException ex) {
            System.out.println("Erro");
        }
        deleta = ppm.getImagem();
        deleta.setPixels((IntBuffer) deleta.getPixels().rewind());


        file = new File("save_as-48.ppm");
        is = null;
        try {
            is = new FileInputStream(file);
        } catch (FileNotFoundException ex) {
            System.out.println("Erro");
        }
        ppm = new PPM();
        try {
            ppm.loadPPM(is);
        } catch (IOException ex) {
            System.out.println("Erro");
        }
        save = ppm.getImagem();
        save.setPixels((IntBuffer) save.getPixels().rewind());

        file = new File("close-48.ppm");
        is = null;
        try {
            is = new FileInputStream(file);
        } catch (FileNotFoundException ex) {
            System.out.println("Erro");
        }
        ppm = new PPM();
        try {
            ppm.loadPPM(is);
        } catch (IOException ex) {
            System.out.println("Erro");
        }
        close = ppm.getImagem();
        close.setPixels((IntBuffer) close.getPixels().rewind());

        file = new File("add_guy.ppm");
        is = null;
        try {
            is = new FileInputStream(file);
        } catch (FileNotFoundException ex) {
            System.out.println("Erro");
        }
        ppm = new PPM();
        try {
            ppm.loadPPM(is);
        } catch (IOException ex) {
            System.out.println("Erro");
        }
        guy = ppm.getImagem();
        guy.setPixels((IntBuffer) guy.getPixels().rewind());
    }

    /**
     * Exibe todas as imagens na parte superior da janela.
     * @param gl 
     */
    public void exibeMenu(GL gl) {
        int xAtu = 0;
        // Move the "drawing cursor" around
        gl.glRasterPos2i(xAtu, windowH);
        xAtu += 60;

        if (novo == null) {
            return;
        }
        //ATENÇÂO -- Precisa destes dois comandos para habilitar o alpha
        gl.glEnable(gl.GL_BLEND);
        gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA);
        // Insere o buffer de INT, com canal alpha e cada BYTE do INT para ARGB respectivamente
        gl.glDrawPixels(novo.getLargura(), novo.getAltura(), gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, novo.getPixels());

        // Move the "drawing cursor" around
        gl.glRasterPos2i(xAtu, windowH);
        xAtu += 70;
        // Insere o buffer de INT, com canal alpha e cada BYTE do INT para ARGB respectivamente
        gl.glDrawPixels(openFile.getLargura(), openFile.getAltura(), gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, openFile.getPixels());
        // Move the "drawing cursor" around
        gl.glRasterPos2i(xAtu, windowH);
        xAtu += 70;
        // Insere o buffer de INT, com canal alpha e cada BYTE do INT para ARGB respectivamente
        gl.glDrawPixels(save.getLargura(), save.getAltura(), gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, save.getPixels());

        // Move the "drawing cursor" around
        gl.glRasterPos2i(xAtu, windowH);
        xAtu += 70;
        // Insere o buffer de INT, com canal alpha e cada BYTE do INT para ARGB respectivamente
        gl.glDrawPixels(novo.getLargura(), novo.getAltura(), gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, addFile.getPixels());
        
        

        // Move the "drawing cursor" around
        gl.glRasterPos2i(xAtu, windowH);
        xAtu += 70;
        // Insere o buffer de INT, com canal alpha e cada BYTE do INT para ARGB respectivamente
        gl.glDrawPixels(deleta.getLargura(), deleta.getAltura(), gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, deleta.getPixels());
        // Move the "drawing cursor" around
        gl.glRasterPos2i(xAtu, windowH);
        xAtu += 610;
        // Insere o buffer de INT, com canal alpha e cada BYTE do INT para ARGB respectivamente
        gl.glDrawPixels(guy.getLargura(), guy.getAltura(), gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, guy.getPixels());
        
        
        // Move the "drawing cursor" around
        gl.glRasterPos2i(xAtu, windowH);
        xAtu += 70;
        // Insere o buffer de INT, com canal alpha e cada BYTE do INT para ARGB respectivamente
        gl.glDrawPixels(close.getLargura(), close.getAltura(), gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, close.getPixels());


    }

    /**
     * Verifica se o clique foi em alguma imagem de menu.
     * @param x
     * @param y
     * @return 
     */
    public int verificaMenu(int x, int y) {

        //Se não clicou na área do menu 
        if (y > 48) {
            return 0;
        }
        //Se clicou em fechar
        if (x > 950) {
            System.exit(0);
        }

        if (x <= 48) {
            return NOVO;
        }

        if (x <= 107) {
            return ABRIR;
        }

        if (x <= 177) {
            return SALVAR;
        }

        if (x <= 256) {
            return ADDFILE;
        }
        if (x <= 312) {
            return DELETAR;
        }
        if (x <= 384) {
            return ADD_GUY;
        }

        return 0;
    }

    /**
     * Aplica efeito de clique na imagem (tons de transparência)
     * @param menuClique 
     */
    void aplicaTransparencia(int menuClique) {

        switch (menuClique) {
            case Menu.NOVO:
                novo.alteraAlpha(153);
                break;
            case Menu.ADDFILE:
                addFile.alteraAlpha(153);
                break;
            case Menu.SALVAR:
                save.alteraAlpha(153);
                break;
            case Menu.ABRIR:
                openFile.alteraAlpha(153);
                break;
            case Menu.DELETAR:
                deleta.alteraAlpha(153);
                break;
            default:
                break;
        }
    }

    /**
     * Ajusta efeito de transparência das imagens.
     */
    void removeTransparencia() {

        novo.removeAlpha();
        addFile.removeAlpha();
        save.removeAlpha();
        openFile.removeAlpha();
        deleta.removeAlpha();
    }
}
